<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <script>
        // promise原型对象上的方法1：then
   const f1 =  new Promise((resolve,reject)=>{
            try{
                console.log('开始请求A数据')
                throw new Error('请求A数据错误')//模拟报错，要写在异步代码的外面
                setTimeout(()=>{
                    console.log('请求A数据成功')
                    resolve('okkk')

                },2000)

            }catch(e){
                reject(e.message)
            }

        })
    // then 方法是给promise实例对象使用的，then方法是同步绑定的，但then中的回调函数是异步的，只有等promise的实例状态发生改变才会执行

    // then方法调用接收两个回调函数作为实参，第一个回调函数用来处理成功状态的promise实例，第二个回调函数用来处理失败状态的promise实例

  const f2 = f1.then((reason)=>{//第一个回调函数接收一个形参，形参的值为调用then方法的成功promise实例的值
        throw new Error('报错')//如果then的回调函数中有报错，则then的返回值为失败状态的promise实例，值为这个报错的错误信息

        // return 1 //在调用then方法的实例对象的状态还没改变时，then返回的是一个pending状态的promise实例

        // 无论调用then方法的promise实例是成功还是失败，都默认返回一个成功状态的promise的实例，值为return后的值，如果不写return，则值为undefined
       
        return new Promise((resolve,reject)=>{ //如果return一个promise实例，则then的返回值和这个return的实例状态和值保持一致
            try{
                // throw new Error('失败了')
                setTimeout(()=>{
                    resolve('成功啦')
                },2000)
            }catch(e){
                reject(e.message)
            }
        })})//如果then中没有处理调用then的promise实例的函数时，调用then的promise直接穿透

    //  ,(result)=>{//第二个回调函数也接收一个形参，形参的值为调用then方法的失败promise实例的值

    //     return result
    // })
    console.log(f2)
        //try和catch是异常处理语句，catch（e）是捕获异常，e就是错误对象


        //总结：
    //会返回失败promise的两种情况
    //1.回调函数中有报错
    //2.return一个失败的promise实例
    //3.当调用then的promise实例是失败状态，但then中没有写处理失败状态的函数
    </script>
</body>
</html>